package com.reservation.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.reservation.common.Result;
import com.reservation.entity.Guide;
import com.reservation.service.GuideService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.time.LocalDate;
import java.util.List;

/**
 * 解说员控制器
 */
@RestController
@RequestMapping("/guide")
public class GuideController {

    @Autowired
    private GuideService guideService;

    /**
     * 添加解说员（仅管理员可用）
     *
     * @param guide 解说员信息
     * @return 添加结果
     */
    @PostMapping
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Guide> addGuide(@RequestBody @Valid Guide guide) {
        Guide addedGuide = guideService.addGuide(guide);
        return Result.success(addedGuide, "添加成功");
    }

    /**
     * 修改解说员信息（仅管理员可用）
     *
     * @param guide 解说员信息
     * @return 修改结果
     */
    @PutMapping
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Guide> updateGuide(@RequestBody @Valid Guide guide) {
        Guide updatedGuide = guideService.updateGuide(guide);
        return Result.success(updatedGuide, "修改成功");
    }

    /**
     * 获取解说员详情
     *
     * @param id 解说员ID
     * @return 解说员信息
     */
    @GetMapping("/{id}")
    public Result<Guide> getGuideById(@PathVariable Long id) {
        Guide guide = guideService.getGuideById(id);
        return Result.success(guide);
    }

    /**
     * 删除解说员（仅管理员可用）
     *
     * @param id 解说员ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Void> deleteGuide(@PathVariable Long id) {
        boolean result = guideService.deleteGuide(id);
        return Result.success(null, "删除成功");
    }

    /**
     * 分页查询解说员列表
     *
     * @param current  当前页
     * @param size     每页大小
     * @param name     解说员姓名（可选）
     * @param language 解说语言（可选）
     * @param status   解说员状态（可选）
     * @return 解说员列表
     */
    @GetMapping("/list")
    public Result<IPage<Guide>> getGuideList(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String language,
            @RequestParam(required = false) String status) {
        Page<Guide> page = new Page<>(pageNum, pageSize);
        IPage<Guide> guidePage = guideService.getGuideList(page, name, language, status);
        return Result.success(guidePage);
    }

    /**
     * 获取所有解说员
     *
     * @return 解说员列表
     */
    @GetMapping("/all")
    public Result<List<Guide>> getAllGuides() {
        List<Guide> guides = guideService.getAllGuides();
        return Result.success(guides);
    }

    /**
     * 获取可用的解说员
     *
     * @return 解说员列表
     */
    @GetMapping("/available")
    public Result<List<Guide>> getAvailableGuides() {
        List<Guide> guides = guideService.getAvailableGuides();
        return Result.success(guides);
    }

    /**
     * 更新解说员状态（仅管理员可用）
     *
     * @param id     解说员ID
     * @param status 解说员状态
     * @return 更新结果
     */
    @PutMapping("/{id}/status")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<Guide> updateGuideStatus(
            @PathVariable Long id,
            @RequestParam String status) {
        Guide guide = guideService.updateGuideStatus(id, status);
        return Result.success(guide, "状态更新成功");
    }

    /**
     * 检查解说员在指定日期是否可预约
     *
     * @param guideId  解说员ID
     * @param date     预约日期
     * @param timeSlot 时间段
     * @return 是否可预约
     */
    @GetMapping("/check-availability")
    public Result<Boolean> checkGuideAvailable(
            @RequestParam Long guideId,
            @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
            @RequestParam String timeSlot) {
        boolean available = guideService.checkGuideAvailable(guideId, date, timeSlot);
        return Result.success(available);
    }
}